home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #2
/
Amiga Plus CD - 1995 - No. 2.iso
/
startrek
/
trek73
/
src
/
strat1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-11
|
9KB
|
366 lines
/*
* TREK73: strat1.c
*
* Standard Enemy Strategy
*
* standard_strategy
*
*/
#include "defines.h"
#include "structs.h"
standard_strategy()
{
extern float fabs();
extern struct ship *shiplist[];
extern int shipnum;
extern int defenseless;
extern int corbomite;
extern int surrender;
extern int surrenderp;
extern char captain[];
extern char science[];
extern char nav[];
extern char com[];
extern char helmsman[];
extern char title[];
extern char foename[];
extern char foerace[];
extern int global;
extern char empire[];
int i;
register struct ship *sp;
register struct ship *fed;
int bear;
int range;
float tmpf;
int loop, loop2;
int probability;
fed = shiplist[0];
for (i=1; i <= shipnum; i++) {
sp = shiplist[i];
if (sp->status & S_DEAD)
continue;
range = rangefind(sp->x, fed->x, sp->y, fed->y);
bear = bearing(sp->x, fed->x, sp->y, fed->y);
bear = rectify(sp->course - bear);
/*
* Take care of special commands like defenseless ruses,
* corbomite bluffs, surrenders (both sides)
*/
/*
* Play dead effects
*/
switch (defenseless) {
case 1: {
if (randm(10) > 2) {
defenseless = 2;
dstrat:
if (randm(2) == 1) {
sp->target = NULL;
sp->newwarp = 0.0;
} else {
sp->newwarp = 1.0;
}
printf("%s: The %s is ",helmsman, sp->name);
if (sp->target != NULL) {
printf("cautiously advancing.\n");
} else {
printf("turning away.\n");
}
astrat:
if ((fabs(sp->target->warp) > 1.0)
|| (range < 200)) {
defenseless = 6;
} else {
for (loop = 0; loop < 4; loop++) {
if (sp->target->shields[loop].drain) {
defenseless = 6;
}
}
}
} else {
printf("%s: No apparent change in the enemy's actions.\n", helmsman);
defenseless = 6;
}
}
break;
case 2: goto dstrat;
case 4: goto astrat;
case 5: goto astrat;
}
/*
* Corbomite bluff effects.
*/
switch (corbomite) {
case 1: {
probability = 30;
if (!strcmp(foerace, "Romulan")) {
probability = 50;
}
if (randm(100) < probability) {
printf("%s: %ss giving ground, Captain. Obviously, they\n", science, foerace);
printf(" tapped in as you expected them to.\n");
printf("%s: A logical assumption, Mr. %s. Are they still\n", captain, science);
printf(" retreating?\n");
printf("%s: Yes, %s\n",science, title);
printf("%s: Good. All hands, stand by.\n",captain);
corbomite = 2;
cstrat:
sp->target = NULL;
sp->newwarp = 3.0 + randm(7);
} else {
printf("%s: Message coming in from the %ss.\n",com, foerace);
printf("%s: Put it on audio.\n",captain);
if (randm(2) == 1) {
printf ("%s: Ha, ha, ha, %s. You lose.\n", foename, captain);
} else {
printf("%s: I fell for that the last time we met, idiot!\n", foename);
}
corbomite = 6;
}
}
break;
case 2: goto cstrat;
case 3: if (fabs(sp->target->warp) > 2.0) {
corbomite = 6;
}
break;
case 4: if (fabs(sp->target->warp) > 2.0) {
corbomite = 6;
}
break;
case 5: if (fabs(sp->target->warp) > 2.0) {
corbomite = 6;
}
break;
}
/*
* Will the enemy accept your surrender?
*/
if (surrender)
switch (surrender) {
case 1: {
probability=49;
if (!strcmp(foerace, "Romulan")) {
probability = 4;
printf("%s: The %ss do not take prisoners.\n", nav, foerace);
}
if (randm(100) < probability) {
if (randm(2) == 1) {
printf("%s: Prepare to die, Chicken %s!\n", foename, captain);
} else {
printf("%s: No reply from the %ss.\n",com, foerace);
}
surrender = 6;
} else {
printf("%s: Message coming in from the %s.\n", com, sp->name);
printf("%s: On behalf of the %s %s, I accept your surrender.\n", foename, foerace, empire);
printf(" You have five seconds to drop your shields, cut\n");
printf(" warp, and prepare to be boarded.\n");
surrender = 2;
global |= F_SURRENDER;
sstrat:
sp->target = fed;
sp->newwarp = 2.0;
}
break;
}
case 2:
case 3: {
warn(3);
goto sstrat;
}
case 4:
case 5: {
for (loop = 0; loop < 4; loop++) {
if (sp->target->shields[loop].attemp_drain)
goto breakout;
}
if (range <= 1400)
sp->newwarp = 1.0;
if ((range > 1000) || (fabs(sp->target->warp) > 1.0)) {
if (surrender == 5) {
printf("%s: Captain %s, you have not fulfilled our terms.\n", foename, captain);
printf(" We are resuming our attack.\n");
}
goto breakout;
} else {
fed->status |= S_SURRENDER;
final(3);
}
}
default: global &= ~F_SURRENDER;
break;
breakout:
break;
}
/*
* Enemy surrenders?
*/
switch (surrenderp) {
case 1:
for (loop = 1; loop < shipnum; loop++)
if (!(sp->status & S_ENG) && (sp->crew > 100)) {
printf("%s: You must be joking, Captain %s. Why don't you\n", foename, captain);
printf(" surrender?\n");
surrenderp = 6;
break;
}
if (loop = shipnum) {
probability = 49;
if (!strcmp (foerace, "Romulan"))
probability = 4;
if (randm(100) < probability) {
printf("%s: As much as I hate to, Captain %s, we will surrender.\n", foename, captain);
printf(" We are dropping shields. You may board us.\n");
surrenderp = 2;
dropshields:
for (loop = 0; loop < 3; loop++)
sp->shields[0].drain = 0;
sp->newwarp = 0.0;
for (loop = 1; loop < shipnum; loop++)
shiplist[loop]->status |= S_SURRENDER;
global |= E_SURRENDER;
} else {
printf("%s: You must be joking, Captain %s. Why don't you\n", foename, captain);
printf(" surrender?\n");
surrenderp = 6;
}
}
break;
case 2:
case 3:
warn(4);
goto dropshields;
}
/*
* Unsportsmanlike firing
*/
if (betw(defenseless, 0, 6) || betw(corbomite, 0, 6)
|| betw(surrender, 0, 6) || betw(surrenderp, 0, 6)) {
for (loop = 0; loop < 4; loop++)
if (fed->phasers[i].status & P_FIRING)
break;
for (loop2 = 0; loop2 < 6; loop2++)
if (fed->tubes[i].status & T_FIRING)
break;
/* Has he fired? */
if ((loop != 4) || (loop2 != 6)) {
/* Yes, be angry and disbelieve everything from now on */
printf("%s: How dare you fire on us! We are\n", foename);
printf(" resuming our attack!\n");
global = NORMAL;
if (betw(defenseless,0,6))
defenseless = 6;
if (betw(corbomite,0,6))
corbomite = 6;
if (betw(surrender,0,6))
surrender = 6;
if (betw(surrenderp,0,6))
surrenderp = 6;
for (loop = 0; loop < shipnum; loop++)
shiplist[loop]->status &= ~S_SURRENDER;
}
}
if ((global & F_SURRENDER) || (global & E_SURRENDER))
continue;
/*
* short range?
* 1). fire phasers
* 2). lock phasers
* 3). evade probes
* 4). enemy to the rear - turn around
* 5). launch a probe?
* 6). self destruct?
* 7). set course.
*/
if (range < 1050) {
if (e_closetorps(sp, fed))
continue;
if (e_lockphasers(sp, fed))
continue;
if (e_phasers(sp, fed))
continue;
if (e_checkprobe(sp))
continue;
if (bear > 90 && bear < 270) {
e_pursue(sp, fed, 1);
continue;
}
if (bear > 90 && bear < 270 && e_launchprobe(sp, fed))
continue;
if (sp->pods<20 && sp->regen < 4.0 && e_destruct(sp))
continue;
/*
* set course?
*/
tmpf = fabs(fed->warp);
if (sp->target != fed || sp->warp + tmpf > 2.0) {
e_pursue(sp, fed, (int)tmpf);
continue;
}
}
if (range < 3800) {
/*
* either medium range, or we can't figure out what
* to do at short range
*/
if (e_torpedo(sp))
continue;
if (e_locktubes(sp, fed))
continue;
/*
* should we run away; can we?
*/
if (e_checkarms(sp) < randm(3)) {
e_runaway(sp, fed);
continue;
}
/*
* pursued from behind, low power: jettison engineering!
*/
if (sp->energy<10 && sp->regen < 4.0 && e_jettison(sp))
continue;
/*
* put in other junk later
*/
}
/*
* either distant range, or we can't figure out
* what to do at medium range
*/
if (fed->delay < 15*10 && (sp->status & S_WARP)) {
e_runaway(sp, fed);
continue;
}
/*
* enemy behind us? make a quick turn.
*/
if (bear > 135 && bear < 225) {
e_pursue(sp, fed, 1);
continue;
}
/*
* attack?
*/
if (sp->pods > 40 && e_attack(sp, fed))
continue;
if (sp->energy > 30 && sp->pods > 40)
if (e_loadtubes(sp))
continue;
if (e_locktubes(sp, fed))
continue;
if (e_lockphasers(sp, fed))
continue;
/*
* gee, there's nothing that we want to do!
*/
printf("%s: We're being scanned by the %s\n", science, sp->name);
}
}